package com.wangwei.authoritySystem.common.utils;

import com.wangwei.authoritySystem.pojo.Permission;
import com.wangwei.authoritySystem.vo.RouterVo;
import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

public class MenuTree {
    /**
     * 生成路由
     * @param menuList 菜单列表
     * @param pid 根菜单ID
     * @return
     */
    public static List<RouterVo> createRouter(List<Permission> menuList,Long pid){
        //创建集合保存路由信息
        List<RouterVo> routerVoList = new ArrayList<RouterVo>();
        //判断菜单列表是否为空，如果不为空则创建菜单列表，否则创建集合对象
        Optional.ofNullable(menuList).orElse(new ArrayList<Permission>())
                .stream().filter(item -> item!=null&& item.getParentId().equals(pid))
                .forEach(item -> {
                    //创建路由信息对象
                    RouterVo routerVo = new RouterVo();
                    routerVo.setName(item.getName());//路由名称
                    routerVo.setPath(item.getPath());//路径
                    //是否为一级菜单
                    if(item.getParentId() == 0L){
                        routerVo.setComponent("Layout");//一级菜单组件
                        routerVo.setAlwaysShow(true);
                    }else{
                        routerVo.setComponent(item.getUrl());
                        routerVo.setAlwaysShow(false);//折叠子菜单
                    }
                    //设置vue-element对应的meta信息
                    routerVo.setMeta(routerVo.new Meta(item.getLabel(),item.getIcon(),item.getCode().split(",")));
                    //递归生成子菜单
                    List<RouterVo> children = createRouter(menuList, item.getId());
                    routerVo.setChildren(children);
                    //路由信息添加到集合
                    routerVoList.add(routerVo);
                });
        //返回路由信息
        return routerVoList;
    }

    /**
     * 生成菜单树
     * @param menuList
     * @param pid
     * @return
     */
    public static List<Permission> createMenuTree(List<Permission> menuList,Long pid){
        //创建集合保存菜单数据
        List<Permission> permissionList = new ArrayList<Permission>();
        Optional.ofNullable(menuList).orElse(new ArrayList<Permission>())
                .stream().filter(item -> item!=null&& item.getParentId().equals(pid))
                .forEach(item -> {
                    //创建权限菜单对象
                    Permission permission = new Permission();
                    //将原有的属性复制给菜单对象
                    BeanUtils.copyProperties(item,permission);
                    //递归生成菜单树
                    List<Permission> children = createMenuTree(menuList, item.getId());
                    permission.setChildren(children);
                    //菜单对象添加到集合
                    permissionList.add(permission);
                });
        return permissionList;
    }
}
